home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / pd / netz / term / extras / source / term-source.lha / termAbout.c < prev    next >
C/C++ Source or Header  |  1995-06-30  |  19KB  |  904 lines

  1. /*
  2. **    termAbout.c
  3. **
  4. **    Support routines for the `About' window.
  5. **
  6. **    Copyright © 1990-1995 by Olaf `Olsen' Barthel
  7. **        All Rights Reserved
  8. */
  9.  
  10. #include "termGlobal.h"
  11.  
  12. #define HEADING 4
  13.  
  14. enum    {    GAD_FRAME=1,GAD_SCROLL,GAD_BUTTON };
  15.  
  16.     /* LocalDeleteBitMap(struct BitMap *BitMap,UWORD Width,UWORD Height):
  17.      *
  18.      *    Delete yet another screen bitmap.
  19.      */
  20.  
  21. STATIC VOID __regargs
  22. LocalDeleteBitMap(struct BitMap *BitMap,UWORD Width,UWORD Height)
  23. {
  24.     if(BitMap)
  25.     {
  26.         WORD i;
  27.  
  28.         WaitBlit();
  29.  
  30.         for(i = 0 ; i < BitMap -> Depth ; i++)
  31.         {
  32.             if(BitMap -> Planes[i])
  33.                 FreeRaster(BitMap -> Planes[i],Width,Height);
  34.         }
  35.  
  36.         FreeVecPooled(BitMap);
  37.     }
  38. }
  39.  
  40.     /* LocalCreateBitMap(UWORD Depth,UWORD Width,UWORD Height):
  41.      *
  42.      *    Create yet another screen bitmap.
  43.      */
  44.  
  45. STATIC struct BitMap * __regargs
  46. LocalCreateBitMap(UWORD Depth,UWORD Width,UWORD Height)
  47. {
  48.     struct BitMap *BitMap;
  49.  
  50.     if(BitMap = (struct BitMap *)AllocVecPooled(sizeof(struct BitMap),MEMF_ANY))
  51.     {
  52.         BYTE    Success = TRUE;
  53.         WORD    i;
  54.  
  55.         InitBitMap(BitMap,Depth,Width,Height);
  56.  
  57.         for(i = 0 ; Success && i < Depth ; i++)
  58.         {
  59.             if(!(BitMap -> Planes[i] = AllocRaster(Width,Height)))
  60.                 Success = FALSE;
  61.         }
  62.  
  63.         if(Success)
  64.             return(BitMap);
  65.  
  66.         LocalDeleteBitMap(BitMap,Width,Height);
  67.     }
  68.  
  69.     return(NULL);
  70. }
  71.  
  72.     /* CreateBitMapFromImage(struct Image *Image,struct BitMap *BitMap):
  73.      *
  74.      *    Turn an Intuition Image into a Gfx BitMap.
  75.      */
  76.  
  77. STATIC VOID __regargs
  78. CreateBitMapFromImage(struct Image *Image,struct BitMap *BitMap)
  79. {
  80.     PLANEPTR    Data    = (PLANEPTR)Image -> ImageData;
  81.     ULONG        Modulo    = ((((ULONG)Image -> Width) + 15) >> 3) & ~1;
  82.     WORD        i;
  83.  
  84.     InitBitMap(BitMap,Image -> Depth,Image -> Width,Image -> Height);
  85.  
  86.     for(i = 0 ; i < Image -> Depth ; i++, Data += Modulo * Image -> Height)
  87.         BitMap -> Planes[i] = Data;
  88. }
  89.  
  90.     /* RecolourBitMap():
  91.      *
  92.      *    Remap a BitMap to use a different colour selection.
  93.      */
  94.  
  95. STATIC struct BitMap * __regargs
  96. RecolourBitMap (struct BitMap *Src, UBYTE * Mapping, UBYTE DestDepth, UWORD Width, UWORD Height)
  97. {
  98.     struct BitMap *Dst;
  99.  
  100.         /* Create the bitmap to hold the remapped data. */
  101.  
  102.     if(Dst = LocalCreateBitMap(DestDepth,Width,Height))
  103.     {
  104.         struct BitMap *SingleMap;
  105.  
  106.             /* Create a single bitplane bitmap. */
  107.  
  108.         if(SingleMap = LocalCreateBitMap(1,Width,Height))
  109.         {
  110.             struct BitMap *FullMap;
  111.  
  112.                 /* Create a dummy bitmap. */
  113.  
  114.             if(FullMap = (struct BitMap *)AllocVecPooled(sizeof(struct BitMap),MEMF_ANY))
  115.             {
  116.                 WORD i,Mask = (1L << Src -> Depth) - 1;
  117.  
  118.                     /* Make the dummy bitmap use the
  119.                      * single bitmap in all planes.
  120.                      */
  121.  
  122.                 InitBitMap(FullMap,DestDepth,Width,Height);
  123.  
  124.                 for(i = 0 ; i < DestDepth ; i++)
  125.                     FullMap -> Planes[i] = SingleMap -> Planes[0];
  126.  
  127.                     /* Clear the destination bitmap. */
  128.  
  129.                 BltBitMap(Dst,0,0,Dst,0,0,Width,Height,MINTERM_ZERO,0xFF,NULL);
  130.  
  131.                     /* Is colour zero to be mapped to a non-zero colour? */
  132.  
  133.                 if(Mapping[0])
  134.                 {
  135.                         /* Clear the single plane bitmap. */
  136.  
  137.                     BltBitMap(SingleMap,0,0,SingleMap,0,0,Width,Height,MINTERM_ZERO,1,NULL);
  138.  
  139.                         /* Merge all source bitplane data. */
  140.  
  141.                     BltBitMap(Src,0,0,FullMap,0,0,Width,Height,MINTERM_B_OR_C,Mask,NULL);
  142.  
  143.                         /* Invert the single plane bitmap, to give us
  144.                          * the zero colour bitmap we can work with.
  145.                          */
  146.  
  147.                     BltBitMap(SingleMap,0,0,SingleMap,0,0,Width,Height,MINTERM_NOT_C,1,NULL);
  148.  
  149.                         /* Now set all the bits for colour zero. */
  150.  
  151.                     BltBitMap(FullMap,0,0,Dst,0,0,Width,Height,MINTERM_B_OR_C,Mapping[0],NULL);
  152.                 }
  153.  
  154.                     /* Run down the colours. */
  155.  
  156.                 for(i = 1 ; i <= Mask ; i++)
  157.                 {
  158.                         /* Set the single plane bitmap to all 1's. */
  159.  
  160.                     BltBitMap(SingleMap,0,0,SingleMap,0,0,Width,Height,MINTERM_ONE,1,NULL);
  161.  
  162.                         /* Isolate the pixels to match the colour
  163.                          * specified in `i'.
  164.                          */
  165.  
  166.                     BltBitMap(Src,0,0,FullMap,0,0,Width,Height,MINTERM_B_AND_C,i,NULL);
  167.  
  168.                     if(Mask ^ i)
  169.                         BltBitMap(Src,0,0,FullMap,0,0,Width,Height,MINTERM_NOT_B_AND_C,Mask ^ i,NULL);
  170.  
  171.                         /* Set the pixels in the destination bitmap,
  172.                          * use the designated colour.
  173.                          */
  174.  
  175.                     BltBitMap(FullMap,0,0,Dst,0,0,Width,Height,MINTERM_B_OR_C,Mapping[i],NULL);
  176.                 }
  177.  
  178.                     /* Free the temporary bitmap. */
  179.  
  180.                 FreeVecPooled(FullMap);
  181.  
  182.                     /* Free the single plane bitmap. */
  183.  
  184.                 LocalDeleteBitMap(SingleMap,Width,Height);
  185.  
  186.                     /* Return the result. */
  187.  
  188.                 return(Dst);
  189.             }
  190.  
  191.             LocalDeleteBitMap(SingleMap,Width,Height);
  192.         }
  193.  
  194.         LocalDeleteBitMap(Dst,Width,Height);
  195.     }
  196.  
  197.     return(NULL);
  198. }
  199.  
  200. STATIC STRPTR Table[] =
  201. {
  202.     "\bBeta testing:",
  203.     "",
  204.     "Peter L. Banville Jr.",
  205.     "Stefan Becker",
  206.     "Abdelkader Benbachir",
  207.     "Martin Berndt",
  208.     "Gregory A. Chance",
  209.     "Keith Christopher",
  210.     "Mark Constable",
  211.     "Steve Corder",
  212.     "Sebastian Delmont",
  213.     "Klaus Dürr",
  214.     "Frank Dürring",
  215.     "Bernd Ernesti",
  216.     "Kenneth Fribert",
  217.     "Kay Gehrke",
  218.     "Jay Grizzard",
  219.     "Stefan Gybas",
  220.     "Christoph Gülicher",
  221.     "Chris Hanson",
  222.     "Peer Hasselmeyer",
  223.     "Christian Hechelmann",
  224.     "Holger Heinrich",
  225.     "Rodney Hester",
  226.     "Florian Hinzmann",
  227.     "Hung-Tung Hsu",
  228.     "Stefan Hudson",
  229.     "Kai Iske",
  230.     "Piotr Kaminski",
  231.     "Andreas M. Kirchwitz",
  232.     "Tony Kirkland",
  233.     "Stellan Klebom",
  234.     "Russell John LeBar",
  235.     "Jason C. Leach",
  236.     "Holger Lubitz",
  237.     "Daniel M. Makovec",
  238.     "Bob Maple",
  239.     "Julian Matthew",
  240.     "Chris Mattingly",
  241.     "Matthias Merkel",
  242.     "Dabe Murphy",
  243.     "William Michael Mushkin",
  244.     "Christopher G. Newby",
  245.     "Dean S. Pemberton",
  246.     "Yves Perrenoud",
  247.     "Olaf Peters",
  248.     "Sven Reger",
  249.     "Robert Reiswig",
  250.     "Matti Rintala",
  251.     "Alfredo Rojas",
  252.     "Karsten Rother",
  253.     "Ottmar Röhrig",
  254.     "Matthias Scheler",
  255.     "Markus Schmall",
  256.     "Robert L. Shady",
  257.     "Leon D. Shaner",
  258.     "Eric W. Sommer",
  259.     "Jason Soukeras",
  260.     "Gary B. Standen",
  261.     "Keith A. Stewart",
  262.     "Joel E. Swan",
  263.     "Jonathan Tew",
  264.     "Bodo Thevissen",
  265.     "Jürgen Zeschky",
  266.     "Michael Zielesny",
  267.     "",
  268.     "\bForeign language translations:",
  269.     "",
  270.     "Olaf Barthel (Deutsch)",
  271.     "Phillippe Brand (Français)",
  272.     "Thomas Egrelius (Svenska)",
  273.     "Michele Girato (Italiano)",
  274.     "Flemming Lindeblad (Dansk)",
  275.     "Edmund Vermeulen (Nederlands)",
  276.     "«Sorry, I lost your name» (Español)",
  277.     "",
  278.     "\bDocumentation:",
  279.     "",
  280.     "Olaf Barthel",
  281.     "Garry Glendown",
  282.     "Henning Hucke",
  283.     "Mike Safer",
  284.     "Mark Schröer",
  285.     "",
  286.     "\bXPR Libraries by:",
  287.     "",
  288.     "Marc Boucher (xmodem)",
  289.     "Terence Finney (bplus)",
  290.     "Rick Huebner & William M. Perkins (zmodem)",
  291.     "Ueli Kaufmann (ascii, ymodem, vms)",
  292.     "Marco Papa & Stephen Walton (kermit)",
  293.     "Jack Rouse (quickb)",
  294.     "",
  295.     "\bXEM Libraries by:",
  296.     "",
  297.     "Ueli Kaufmann (amiga, ascii, bbs, vt340)",
  298.     "Stef Rave (rip)",
  299.     "",
  300.     "\bPeople who will deny that",
  301.     "\bthey were ever involved:",
  302.     "",
  303.     "John Burton",
  304.     "Peter Fischer",
  305.     "David Göhler",
  306.     "Michael Wolfgang Hohmann",
  307.     "David Jones",
  308.     "Marko Küchmann",
  309.     "Bernd Lambracht",
  310.     "Roby Leeman & AUGS",
  311.     "Frank Mariak",
  312.     "Germar Morgenthaler",
  313.     "Jürgen Otte",
  314.     "Till `Dill-Prince' Prinzler",
  315.     "Nicola Salmoria",
  316.     "Ralph Schmidt",
  317.     "Veith Schörgenhummer",
  318.     "Thorsten Seidel",
  319.     "Markus Stoll",
  320.     "Martin Taillefer",
  321.     "Christoph Teuber",
  322.     "Ralf Thanner",
  323.     "Volker Ulle & the Aquila Sysop Team",
  324.     "Michael Vaeth",
  325.     "Oliver Wagner",
  326.     "Christopher Wichura",
  327.     "Udo Wolt",
  328.     "Matthias Zepf",
  329.     "",
  330.     "\aDon't switch off, it's almost over!",
  331.     "",
  332.     NULL
  333. };
  334.  
  335. STATIC VOID __regargs
  336. PrintThisLine(struct RastPort *RPort,struct Rectangle *Clip,LONG Top,STRPTR Line)
  337. {
  338.     LONG Len,Width;
  339.  
  340.     Len = strlen(Line);
  341.  
  342.     if(*Line == '\b' || *Line == '\a')
  343.     {
  344.         ULONG Style;
  345.  
  346.         if(*Line == '\b')
  347.             Style = FSF_BOLD;
  348.         else
  349.             Style = FSF_ITALIC;
  350.  
  351.         SetSoftStyle(RPort,Style,FSF_BOLD | FSF_ITALIC);
  352.         Line++;
  353.         Len--;
  354.     }
  355.     else
  356.         SetSoftStyle(RPort,0,FSF_BOLD | FSF_ITALIC);
  357.  
  358.     if(Len > 0)
  359.     {
  360.         Width = TextLength(RPort,Line,Len);
  361.  
  362.         Move(RPort,Clip -> MinX + (Clip -> MaxX - Clip -> MinX + 1 - Width) / 2,RPort -> TxBaseline + Top);
  363.         Text(RPort,Line,Len);
  364.     }
  365. }
  366.  
  367.  
  368.     /* ShowAbout():
  369.      *
  370.      *    Open a window, draw the `term' logo, show some text
  371.      *    and wait for user reaction.
  372.      */
  373.  
  374. BYTE __regargs
  375. ShowAbout(BYTE Ticks)
  376. {
  377.     struct BitMap        *ImageBitMap = NULL;
  378.     LONG             ImageWidth,
  379.                  ImageHeight;
  380.     BYTE             GotRexxMessage = FALSE;
  381.     struct LayoutHandle    *Handle;
  382.  
  383.     if(IconBase)
  384.     {
  385.         struct DiskObject *Icon;
  386.  
  387.         if(Icon = GetProgramIcon())
  388.         {
  389.             STATIC UWORD DefaultColours[4] =
  390.             {
  391.                 0xAAA,
  392.                 0x000,
  393.                 0xFFF,
  394.                 0x68B
  395.             };
  396.  
  397.             UBYTE    Mapping[4];
  398.             UWORD    Colour1,Colour2;
  399.             WORD    ChannelDistance;
  400.             LONG    Distance,BestDistance,BestIndex,Depth,Count,i,j;
  401.             BOOLEAN    Duplicates = FALSE;
  402.  
  403.             Depth = GetBitMapDepth(Window -> RPort -> BitMap);
  404.             Count = Window -> WScreen -> ViewPort . ColorMap -> Count;
  405.  
  406.             if(Depth > 8)
  407.                 Depth = 8;
  408.  
  409.             if(Count > (1L << Depth))
  410.                 Count = 1L << Depth;
  411.  
  412.             if(Count > 256)
  413.                 Count = 256;
  414.  
  415.             if(Count >= 4)
  416.             {
  417.                 for(i = 0 ; i < 4 ; i++)
  418.                 {
  419.                     Colour2 = DefaultColours[i];
  420.  
  421.                     BestDistance    = 3 * 15 * 15;
  422.                     BestIndex    = 0;
  423.  
  424.                     for(j = 0 ; j < Count ; j++)
  425.                     {
  426.                         Colour1 = GetRGB4(Window -> WScreen -> ViewPort . ColorMap,j);
  427.  
  428.                         ChannelDistance = ((WORD)((Colour1 >> 8) & 0xF)) - ((WORD)((Colour2 >> 8) & 0xF));
  429.  
  430.                         Distance = ChannelDistance * ChannelDistance;
  431.  
  432.                         ChannelDistance = ((WORD)((Colour1 >> 4) & 0xF)) - ((WORD)((Colour2 >> 4) & 0xF));
  433.  
  434.                         Distance += ChannelDistance * ChannelDistance;
  435.  
  436.                         ChannelDistance = ((WORD)(Colour1 & 0xF)) - ((WORD)(Colour2 & 0xF));
  437.  
  438.                         Distance += ChannelDistance * ChannelDistance;
  439.  
  440.                         if(Distance < BestDistance)
  441.                         {
  442.                             BestDistance    = Distance;
  443.                             BestIndex    = j;
  444.                         }
  445.                     }
  446.  
  447.                     Mapping[i] = BestIndex;
  448.                 }
  449.  
  450.                 for(i = 0 ; !Duplicates && i < 4 ; i++)
  451.                 {
  452.                     for(j = i + 1 ; !Duplicates && j < 4 ; j++)
  453.                         Duplicates = (Mapping[i] == Mapping[j]);
  454.                 }
  455.  
  456.                 if(!Duplicates)
  457.                 {
  458.                     struct BitMap     LocalBitMap;
  459.                     struct Image    *Image;
  460.  
  461.                     Image = Icon -> do_Gadget . GadgetRender;
  462.  
  463.                     if(Image -> Depth == 2)
  464.                     {
  465.                         CreateBitMapFromImage(Image,&LocalBitMap);
  466.  
  467.                         if(ImageBitMap = RecolourBitMap(&LocalBitMap,Mapping,Depth,Image -> Width,Image -> Height))
  468.                         {
  469.                             ImageWidth    = Image -> Width;
  470.                             ImageHeight    = Image -> Height;
  471.                         }
  472.                     }
  473.                 }
  474.             }
  475.  
  476.             FreeDiskObject(Icon);
  477.         }
  478.     }
  479.  
  480.     if(Handle = LT_CreateHandleTags(Window -> WScreen,
  481.         LH_LocaleHook,    &LocaleHook,
  482.         LH_ExactClone,    TRUE,
  483.     TAG_DONE))
  484.     {
  485.         STRPTR             AboutLines[3],
  486.                      RequestLines[4],
  487.                      StandardMail[4],
  488.                      ElectronicMail[2];
  489.         struct Window        *PanelWindow;
  490.         WORD             i;
  491.         struct Region        *Clip = NULL,*Old;
  492.         struct Rectangle     ClipRect;
  493.         LONG             ClipWidth,
  494.                      ClipHeight;
  495.  
  496.         if(!Ticks)
  497.         {
  498.             struct RastPort    This;
  499.             ULONG        Width,MaxWidth,Len,i;
  500.             STRPTR        String;
  501.  
  502.             InitRastPort(&This);
  503.             SetFont(&This,UserTextFont);
  504.  
  505.             for(i = MaxWidth = 0 ; Table[i] ; i++)
  506.             {
  507.                 Len = strlen(String = Table[i]);
  508.  
  509.                 if(*String == '\b' || *String == '\a')
  510.                 {
  511.                     ULONG Style;
  512.  
  513.                     if(*String == '\b')
  514.                         Style = FSF_BOLD;
  515.                     else
  516.                         Style = FSF_ITALIC;
  517.  
  518.                     SetSoftStyle(&This,Style,FSF_BOLD | FSF_ITALIC);
  519.                     String++;
  520.                     Len--;
  521.                 }
  522.                 else
  523.                     SetSoftStyle(&This,0,FSF_BOLD | FSF_ITALIC);
  524.  
  525.                 if(Len > 0)
  526.                 {
  527.                     Width = TextLength(&This,String,Len);
  528.  
  529.                     if(Width > MaxWidth)
  530.                         MaxWidth = Width;
  531.                 }
  532.             }
  533.  
  534.             ClipWidth    = MaxWidth;
  535.             ClipHeight    = HEADING * This . TxHeight;
  536.  
  537.             Clip = NewRegion();
  538.         }
  539.  
  540.         for(i = 0 ; i < 2 ; i++)
  541.             AboutLines[i] = LocaleString(MSG_TERMINFO_INFOTEXT1_TXT + i);
  542.  
  543.         AboutLines[i] = NULL;
  544.  
  545.         for(i = 0 ; i < 3 ; i++)
  546.             RequestLines[i] = LocaleString(MSG_TERMINFO_INFOTEXT4_TXT + i);
  547.  
  548.         RequestLines[i] = NULL;
  549.  
  550.         for(i = 0 ; i < 3 ; i++)
  551.             StandardMail[i] = LocaleString(MSG_TERMINFO_INFOTEXT10_TXT + i);
  552.  
  553.         StandardMail[i] = NULL;
  554.  
  555.         for(i = 0 ; i < 1 ; i++)
  556.             ElectronicMail[i] = LocaleString(MSG_TERMINFO_INFOTEXT16_TXT + i);
  557.  
  558.         ElectronicMail[i] = NULL;
  559.  
  560.         LT_New(Handle,
  561.             LA_Type,    VERTICAL_KIND,
  562.         TAG_DONE);
  563.         {
  564.             LT_New(Handle,
  565.                 LA_Type,    VERTICAL_KIND,
  566.                 LA_LabelText,    TermName,
  567.             TAG_DONE);
  568.             {
  569.                 if(ImageBitMap)
  570.                 {
  571.                     LT_New(Handle,
  572.                         LA_Type,    VERTICAL_KIND,
  573.                     TAG_DONE);
  574.                     {
  575.                         LT_New(Handle,
  576.                             LA_Type,        FRAME_KIND,
  577.                             LAFR_InnerWidth,    ImageWidth,
  578.                             LAFR_InnerHeight,    ImageHeight,
  579.                             LA_DrawBox,        FALSE,
  580.                             LA_ID,            GAD_FRAME,
  581.                         TAG_DONE);
  582.  
  583.                         LT_EndGroup(Handle);
  584.                     }
  585.                 }
  586.  
  587.                 LT_New(Handle,
  588.                     LA_Type,    VERTICAL_KIND,
  589.                 TAG_DONE);
  590.                 {
  591.                     LT_New(Handle,
  592.                         LA_Type,    BOX_KIND,
  593.                         LA_Chars,    56,
  594.                         LABX_Lines,    AboutLines,
  595.                         LABX_AlignText,    ALIGNTEXT_CENTERED,
  596.                         LABX_DrawBox,    FALSE,
  597.                     TAG_DONE);
  598.  
  599.                     LT_EndGroup(Handle);
  600.                 }
  601.  
  602.                 if(!Ticks && Clip)
  603.                 {
  604.                     LT_New(Handle,
  605.                         LA_Type,    VERTICAL_KIND,
  606.                     TAG_DONE);
  607.                     {
  608.                         LT_New(Handle,
  609.                             LA_Type,    XBAR_KIND,
  610.                         TAG_DONE);
  611.  
  612.                         LT_New(Handle,
  613.                             LA_Type,        FRAME_KIND,
  614.                             LAFR_InnerWidth,    ClipWidth + 4,
  615.                             LAFR_InnerHeight,    ClipHeight + 2,
  616.                             LA_DrawBox,        FALSE,
  617.                             LA_ID,            GAD_SCROLL,
  618.                         TAG_DONE);
  619.  
  620.                         LT_EndGroup(Handle);
  621.                     }
  622.                 }
  623.  
  624.                 LT_EndGroup(Handle);
  625.             }
  626.  
  627.             LT_New(Handle,
  628.                 LA_Type,    VERTICAL_KIND,
  629.                 LA_LabelID,    MSG_V36_1030,
  630.             TAG_DONE);
  631.             {
  632.                 LT_New(Handle,
  633.                     LA_Type,    VERTICAL_KIND,
  634.                 TAG_DONE);
  635.                 {
  636.                     LT_New(Handle,
  637.                         LA_Type,    BOX_KIND,
  638.                         LA_Chars,    56,
  639.                         LABX_Lines,    RequestLines,
  640.                         LABX_AlignText,    ALIGNTEXT_CENTERED,
  641.                         LABX_DrawBox,    FALSE,
  642.                     TAG_DONE);
  643.  
  644.                     LT_EndGroup(Handle);
  645.                 }
  646.  
  647.                 LT_New(Handle,
  648.                     LA_Type,    VERTICAL_KIND,
  649.                     LA_LabelID,    MSG_V36_1031,
  650.                 TAG_DONE);
  651.                 {
  652.                     LT_New(Handle,
  653.                         LA_Type,    BOX_KIND,
  654.                         LA_Chars,    56,
  655.                         LABX_Lines,    StandardMail,
  656.                         LABX_AlignText,    ALIGNTEXT_CENTERED,
  657.                         LABX_DrawBox,    FALSE,
  658.                     TAG_DONE);
  659.  
  660.                     LT_EndGroup(Handle);
  661.                 }
  662.  
  663.                 LT_New(Handle,
  664.                     LA_Type,    VERTICAL_KIND,
  665.                     LA_LabelID,    MSG_V36_1032,
  666.                 TAG_DONE);
  667.                 {
  668.                     LT_New(Handle,
  669.                         LA_Type,    BOX_KIND,
  670.                         LA_Chars,    56,
  671.                         LABX_Lines,    ElectronicMail,
  672.                         LABX_AlignText,    ALIGNTEXT_CENTERED,
  673.                         LABX_DrawBox,    FALSE,
  674.                     TAG_DONE);
  675.  
  676.                     LT_EndGroup(Handle);
  677.                 }
  678.  
  679.                 LT_EndGroup(Handle);
  680.             }
  681.  
  682.             if(!Ticks)
  683.             {
  684.                 LT_New(Handle,
  685.                     LA_Type,VERTICAL_KIND,
  686.                 TAG_DONE);
  687.                 {
  688.                     LT_New(Handle,LA_Type,XBAR_KIND,LAXB_FullSize,TRUE,TAG_DONE);
  689.  
  690.                     LT_New(Handle,
  691.                         LA_Type,    BUTTON_KIND,
  692.                         LA_LabelID,    MSG_V36_1033,
  693.                         LA_ID,        GAD_BUTTON,
  694.                         LABT_ReturnKey,    TRUE,
  695.                         LABT_ExtraFat,    TRUE,
  696.                     TAG_DONE);
  697.  
  698.                     LT_EndGroup(Handle);
  699.                 }
  700.             }
  701.  
  702.             LT_EndGroup(Handle);
  703.         }
  704.  
  705.         if(!Ticks)
  706.         {
  707.             PanelWindow = LT_Layout(Handle,LocaleString(MSG_V36_1034),NULL,0,0,IDCMP_CLOSEWINDOW | IDCMP_INTUITICKS,0,
  708.                 LAWN_HelpHook,        &GuideHook,
  709.                 LAWN_MaxPen,        -1,
  710.                 LAWN_Parent,        Window,
  711.                 WA_DepthGadget,        TRUE,
  712.                 WA_CloseGadget,        TRUE,
  713.                 WA_DragBar,        TRUE,
  714.                 WA_RMBTrap,        TRUE,
  715.                 WA_Activate,        TRUE,
  716.             TAG_DONE);
  717.         }
  718.         else
  719.         {
  720.             PanelWindow = LT_Layout(Handle,NULL,NULL,0,0,IDCMP_RAWKEY | IDCMP_MOUSEMOVE | IDCMP_MOUSEBUTTONS | IDCMP_INTUITICKS,0,
  721.                 LAWN_HelpHook,        &GuideHook,
  722.                 LAWN_MaxPen,        -1,
  723.                 LAWN_Parent,        Window,
  724.                 WA_RMBTrap,        TRUE,
  725.                 WA_Activate,        TRUE,
  726.                 WA_ReportMouse,        TRUE,
  727.             TAG_DONE);
  728.         }
  729.  
  730.         if(PanelWindow)
  731.         {
  732.             struct IntuiMessage    *Message;
  733.             BOOLEAN             Done = FALSE;
  734.             ULONG             MsgClass,
  735.                          MsgQualifier;
  736.             UWORD             MsgCode;
  737.             struct Gadget        *MsgGadget;
  738.             ULONG             Signals;
  739.             LONG             TickCount = 0;
  740.             LONG             Top,Total,LastLine,IntroTicks = 15;
  741.  
  742.             if(ImageBitMap)
  743.             {
  744.                 LONG Left,Top;
  745.  
  746.                 LT_GetAttributes(Handle,GAD_FRAME,
  747.                     LA_Left,    &Left,
  748.                     LA_Top,        &Top,
  749.                 TAG_DONE);
  750.  
  751.                 BltBitMapRastPort(ImageBitMap,0,0,PanelWindow -> RPort,Left,Top,ImageWidth,ImageHeight,MINTERM_COPY);
  752.             }
  753.  
  754.             if(!Ticks)
  755.             {
  756.                 LONG LeftEdge,TopEdge;
  757.  
  758.                 LT_GetAttributes(Handle,GAD_SCROLL,
  759.                     LA_Left,    &LeftEdge,
  760.                     LA_Top,        &TopEdge,
  761.                 TAG_DONE);
  762.  
  763.                 ClipRect . MinX    = LeftEdge + 2;
  764.                 ClipRect . MinY    = TopEdge + 2;
  765.                 ClipRect . MaxX    = LeftEdge + 2 + ClipWidth - 1;
  766.                 ClipRect . MaxY = TopEdge + 2 + ClipHeight - 1;
  767.  
  768.                 SetFont(PanelWindow -> RPort,UserTextFont);
  769.  
  770.                 if(Kick30)
  771.                     SetABPenDrMd(PanelWindow -> RPort,Handle -> DrawInfo -> dri_Pens[TEXTPEN],Handle -> DrawInfo -> dri_Pens[BACKGROUNDPEN],JAM2);
  772.                 else
  773.                 {
  774.                     SetAPen(PanelWindow -> RPort,Handle -> DrawInfo -> dri_Pens[TEXTPEN]);
  775.                     SetBPen(PanelWindow -> RPort,Handle -> DrawInfo -> dri_Pens[BACKGROUNDPEN]);
  776.                     SetDrMd(PanelWindow -> RPort,JAM2);
  777.                 }
  778.  
  779.                 if(OrRectRegion(Clip,&ClipRect))
  780.                 {
  781.                     LONG i;
  782.  
  783.                     Old = InstallClipRegion(PanelWindow -> WLayer,Clip);
  784.  
  785.                     Top = ClipRect . MinY;
  786.  
  787.                     for(i = 0 ; i < HEADING ; i++)
  788.                     {
  789.                         PrintThisLine(PanelWindow -> RPort,&ClipRect,Top,Table[i]);
  790.  
  791.                         Top += PanelWindow -> RPort -> TxHeight;
  792.                     }
  793.  
  794.                     LastLine = i;
  795.  
  796.                     Total = 0;
  797.                 }
  798.                 else
  799.                 {
  800.                     DisposeRegion(Clip);
  801.                     Clip = NULL;
  802.                 }
  803.             }
  804.  
  805.             while(Message = GT_GetIMsg(PanelWindow -> UserPort))
  806.                 GT_ReplyIMsg(Message);
  807.  
  808.             if(!Ticks)
  809.                 PushWindow(PanelWindow);
  810.             else
  811.                 Say(LocaleString(MSG_TERMINFO_WELCOME_TO_TERM_TXT));
  812.  
  813.             do
  814.             {
  815.                 Signals = Wait(PORTMASK(PanelWindow -> UserPort) | SIG_BREAK | SIG_REXX);
  816.  
  817.                 if(Signals & SIG_BREAK)
  818.                     break;
  819.  
  820.                 if(Ticks)
  821.                 {
  822.                     if(Signals & SIG_REXX)
  823.                     {
  824.                         GotRexxMessage = TRUE;
  825.  
  826.                         break;
  827.                     }
  828.                 }
  829.  
  830.                 while(Message = (struct IntuiMessage *)GT_GetIMsg(PanelWindow -> UserPort))
  831.                 {
  832.                     MsgClass    = Message -> Class;
  833.                     MsgQualifier    = Message -> Qualifier;
  834.                     MsgCode        = Message -> Code;
  835.                     MsgGadget    = (struct Gadget *)Message -> IAddress;
  836.  
  837.                     GT_ReplyIMsg(Message);
  838.  
  839.                     if(Ticks)
  840.                     {
  841.                         if(MsgClass == IDCMP_INTUITICKS && TickCount++ >= 50)
  842.                             Done = TRUE;
  843.  
  844.                         if((MsgClass == IDCMP_RAWKEY || MsgClass == IDCMP_MOUSEBUTTONS) && !(MsgCode & IECODE_UP_PREFIX))
  845.                             Done = TRUE;
  846.  
  847.                         if(MsgClass == IDCMP_MOUSEMOVE)
  848.                             Done = TRUE;
  849.                     }
  850.                     else
  851.                     {
  852.                         LT_HandleInput(Handle,MsgQualifier,&MsgClass,&MsgCode,&MsgGadget);
  853.  
  854.                         if(MsgClass == IDCMP_CLOSEWINDOW || MsgClass == IDCMP_GADGETUP)
  855.                             Done = TRUE;
  856.  
  857.                         if(MsgClass == IDCMP_INTUITICKS && Clip)
  858.                         {
  859.                             if(IntroTicks > 0)
  860.                                 IntroTicks--;
  861.                             else
  862.                             {
  863.                                 ScrollRaster(PanelWindow -> RPort,0,1,ClipRect . MinX,ClipRect . MinY,ClipRect . MaxX,ClipRect . MaxY);
  864.  
  865.                                 Total++;
  866.  
  867.                                 PrintThisLine(PanelWindow -> RPort,&ClipRect,Top - Total,Table[LastLine]);
  868.  
  869.                                 if(Total == PanelWindow -> RPort -> TxHeight)
  870.                                 {
  871.                                     Total = 0;
  872.  
  873.                                     LastLine++;
  874.  
  875.                                     if(!Table[LastLine])
  876.                                         LastLine = 0;
  877.                                 }
  878.                             }
  879.                         }
  880.                     }
  881.                 }
  882.             }
  883.             while(!Done);
  884.  
  885.             if(Clip)
  886.             {
  887.                 InstallClipRegion(PanelWindow -> WLayer,Old);
  888.  
  889.                 DisposeRegion(Clip);
  890.             }
  891.  
  892.             if(!Ticks)
  893.                 PopWindow();
  894.         }
  895.  
  896.         LT_DeleteHandle(Handle);
  897.     }
  898.  
  899.     if(ImageBitMap)
  900.         LocalDeleteBitMap(ImageBitMap,ImageWidth,ImageHeight);
  901.  
  902.     return(GotRexxMessage);
  903. }
  904.